const express = require('express');
const fs = require('fs');
const path = require('path');
const cors = require('cors');

const app = express();
const PORT = process.env.PORT || 3000;

// 中间件
app.use(cors());
app.use(express.static(path.join(__dirname, 'public')));

// 视频目录路径
const VIDEO_DIR = path.join(__dirname, 'videos');

// 确保视频目录存在
if (!fs.existsSync(VIDEO_DIR)) {
    fs.mkdirSync(VIDEO_DIR);
    console.log(`Created videos directory at ${VIDEO_DIR}`);
}

// 获取视频列表
app.get('/videos', (req, res) => {
    fs.readdir(VIDEO_DIR, (err, files) => {
        if (err) {
            console.error('Error reading videos directory:', err);
            return res.status(500).json({ error: '无法读取视频目录' });
        }
        
        const videos = files
            .filter(file => {
                const ext = path.extname(file).toLowerCase();
                return ['.mp4', '.webm', '.ogg'].includes(ext);
            })
            .map(file => ({
                title: path.basename(file, path.extname(file)),
                path: file,
                type: `video/${path.extname(file).slice(1)}`
            }));
        
        res.json(videos);
    });
});

// 视频流端点
app.get('/video/:filename', (req, res) => {
    const filename = decodeURIComponent(req.params.filename);
    const filePath = path.join(VIDEO_DIR, filename);
    
    // 检查文件是否存在
    if (!fs.existsSync(filePath)) {
        return res.status(404).send('视频文件未找到');
    }
    
    const stat = fs.statSync(filePath);
    const fileSize = stat.size;
    const range = req.headers.range;
    
    if (range) {
        // 处理范围请求（用于支持视频流和跳转）
        const parts = range.replace(/bytes=/, "").split("-");
        const start = parseInt(parts[0], 10);
        const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1;
        
        const chunksize = (end - start) + 1;
        const file = fs.createReadStream(filePath, { start, end });
        const head = {
            'Content-Range': `bytes ${start}-${end}/${fileSize}`,
            'Accept-Ranges': 'bytes',
            'Content-Length': chunksize,
            'Content-Type': 'video/mp4',
        };
        
        res.writeHead(206, head);
        file.pipe(res);
    } else {
        // 如果没有范围请求，发送整个文件
        const head = {
            'Content-Length': fileSize,
            'Content-Type': 'video/mp4',
        };
        
        res.writeHead(200, head);
        fs.createReadStream(filePath).pipe(res);
    }
});

// 提供前端文件
app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, 'public', 'video_player.html'));
});

// 启动服务器
app.listen(PORT, () => {
    console.log(`服务器运行在 http://localhost:${PORT}`);
    console.log(`请将视频文件放入 ${VIDEO_DIR} 目录中`);
});